package ar.uade.distribuidas.tpo.cpe.dao;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import ar.uade.distribuidas.tpo.base.utils.FormatUtils;
import ar.uade.distribuidas.tpo.dba.dominio.ItemListaPrecio;
import ar.uade.distribuidas.tpo.dba.dominio.ListaPrecio;
import ar.uade.distribuidas.tpo.dba.dominio.Proveedor;
import ar.uade.distribuidas.tpo.dba.dominio.Rodamiento;
import ar.uade.distribuidas.tpo.dba.servicio.GestionProveedor;
import ar.uade.distribuidas.tpo.dba.servicio.GestionRodamiento;

public class ListaPrecioXmlDAO {

	private static ListaPrecioXmlDAO instancia;
	private static String ARCHIVO = "lista-de-precios.xml";
	private Document doc;

	private ListaPrecioXmlDAO() {
		super();
	}

	private void createDocument(){
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			doc = builder.parse(ARCHIVO);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	public static ListaPrecioXmlDAO getInstancia() {
		if (instancia == null) {
			instancia = new ListaPrecioXmlDAO();
			instancia.createDocument();
		}
		return instancia;
	}

	public Set<ListaPrecio> recuperarListaPrecio() {
		Set<ListaPrecio> lps = new HashSet<ListaPrecio>();
		NodeList nodos = doc.getElementsByTagName("ListaPrecios");
		for (int i = 0; i < nodos.getLength(); i++) {
			if (nodos.item(i).hasChildNodes()) {
				lps.add(mapStock((Element) nodos.item(i)));
			}
		}
		return lps;
	}

	private ListaPrecio mapStock(Element eleListaP) {

		ListaPrecio lp = new ListaPrecio();

		try {
			Element p = (Element) new Proveedor();
			((Proveedor) p).setCuil((Long.parseLong(eleListaP.getAttribute("cuil"))));
			((Proveedor) p).setNombre(eleListaP.getAttribute("RazonSocial"));

			lp.setProveedor(new GestionProveedor().getProveedor(Long.parseLong(getValue("Cuil", p))));

			DateFormat df = new SimpleDateFormat(FormatUtils.DATE_PATTERN);
			lp.setFechaDesde((df.parse(eleListaP.getAttribute("Fecha"))));

			Calendar calendar = Calendar.getInstance();
			calendar.setTime(df.parse(eleListaP.getAttribute("Fecha"))); // Configuramos
																			// la
																			// fecha
																			// que
																			// se
																			// recibe
			calendar.add(Calendar.DAY_OF_YEAR, Integer.valueOf(eleListaP.getAttribute("Termino"))); // numero
																									// de
																									// d�as
																									// a
																									// a�adir,
																									// o
																									// restar
																									// en
																									// caso
																									// de
																									// d�as<0

			lp.setFechaHasta(calendar.getTime());

			Element rodamiento = (Element) doc.getElementsByTagName("Rodamientos").item(0);
			NodeList items = rodamiento.getElementsByTagName("Item");

			for (int j = 0; j < items.getLength(); j++) {
				Node item = items.item(j);

				if (item.getNodeType() == Node.ELEMENT_NODE) {
					Element it = (Element) item;
					Rodamiento r = new GestionRodamiento().getRodamiento(it.getAttribute("serie"), getValue("Sufijo", it),
							getValue("Marca", it), getValue("Origen", it));
					if (r != null) {
						ItemListaPrecio ip = new ItemListaPrecio();
						Double costo = Double.valueOf(it.getAttribute("Precio"));
						ip.setCosto(costo);
						ip.setRodamiento(r);
						lp.createListItem();
						lp.getItems().add(ip);
					}

				}

			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return lp;
	}

	private static String getValue(String tag, Element element) {
		NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes();
		Node node = (Node) nodes.item(0);
		if (node != null) {
			return node.getNodeValue();
		}
		return "";
	}

}
